"Exercicio 1.7"
"Sobre raiz e precisão"

(define (raiz-iter chute x bom-suficiente?)
  (if (bom-suficiente? chute x)
      chute
      (raiz-iter (melhora chute x)
                 x
                 bom-suficiente?)))

(define (melhora chute x)
  (media chute (/ x chute)))

(define (media x y)
  (/ (+ x y) 2))

(define (quadrado x) (* x x))

(define (raiz1 x) (raiz-iter 1.0 x bom-suficiente?))

(define (raiz2 x) (raiz-iter 1.0 x bom-suficiente?2))

(define (bom-suficiente?2 chute x)
  (= (melhora chute x) chute))

(define (bom-suficiente? chute x)
  (< (abs (- (quadrado chute) x)) 0.001))

"raiz1 usa o bom-suficiente? definido no livro."
"  Para valores pequenos, ele erra pois o limiar que ele define é muito alto:"
(list (raiz1 0.0001) "deveria ser 0.01")
(list (raiz1 0.000001) "deveria ser 0.001")
"  Para valores grandes, ele nunca termina. Tente se quiser: (raiz1 1e64)."
"  Isso pois:"
(list "(melhora 1e32 1e64) é" (melhora 1e32 1e64))
"  Mas (bom-suficiente? 1e32 1e64) é falso, uma vez que"
(list "(- (* 1e32 1e32) 1e64) é" (- (* 1e32 1e32) 1e64) "que é maior que 0.0001")
"raiz2 usa um bom-suficiente? que compara o quadrado do chute com x por igualdade..."
"   Ele parece funcionar bem:"
(list (raiz2 0.0001) "deveria ser 0.01")
(list (raiz2 0.000001) "deveria ser 0.001")
(list (raiz2 1e64) "deveria ser 1e32")
(list  "raiz2 de 2:" (raiz2 2) "ao quadrado:" (quadrado (raiz2 2)))
(list  "raiz2 de 121:" (raiz2 121) "ao quadrado:" (quadrado (raiz2 121)))
(list  "raiz2 de 13:" (raiz2 13) "ao quadrado:" (quadrado (raiz2 13)))
(list  "raiz2 de 1e35:" (raiz2 1e35) "ao quadrado:" (quadrado (raiz2 1e35)))